﻿using Microsoft.Extensions.Caching.Memory;

namespace Sage.Caching.Memory.Options
{
    /// <summary>
    /// 内存缓存服务的配置选项。
    /// </summary>
    public class MemoryCacheServiceOptions
    {
        /// <summary>
        /// 默认的缓存项配置选项，例如过期时间、大小等。
        /// </summary>
        public MemoryCacheEntryOptions DefaultEntryOptions { get; set; } = new MemoryCacheEntryOptions
        {
            AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(10),
            Size = 1 // 每个缓存项的默认大小
        };

        /// <summary>
        /// 是否启用缓存统计。默认不开启以获得最佳性能。
        /// </summary>
        public bool EnableStats { get; set; } = false;

        /// <summary>
        /// 当创建缓存项发生异常时，是否抛出异常。
        /// 如果设置为 false，则返回默认值。
        /// </summary>
        public bool ThrowOnCreateError { get; set; } = true;

        /// <summary>
        /// 统计信息批量刷新间隔，用于优化统计数据的处理。
        /// </summary>
        public TimeSpan StatsFlushInterval { get; set; } = TimeSpan.FromSeconds(30);

        /// <summary>
        /// 内存缓存的总大小限制（单位：项）。默认无总大小限制。
        /// </summary>
        public long? MaximumCacheSize { get; set; }

        /// <summary>
        /// 缓存扫描过期项的频率。默认为30秒。
        /// </summary>
        public TimeSpan ExpirationScanFrequency { get; set; } = TimeSpan.FromSeconds(30);

        /// <summary>
        /// 内存压力下触发压缩的百分比（0.0-1.0）。默认为0.05（5%）。
        /// </summary>
        public double CompactionPercentage { get; set; } = 0.05;

        /// <summary>
        /// 是否对所有的缓存操作进行类型检查，影响性能但增加类型安全。
        /// </summary>
        public bool EnableTypeChecking { get; set; } = true;

        /// <summary>
        /// 键名前缀，用于防止键名冲突。
        /// </summary>
        public string? KeyPrefix { get; set; }
    }
}
